<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Document</title>
</head>

<body>
  <button onclick="save()">保存文件</button>
</body>
<script>
  function save() {
    getFileContent('./config.js').then(content => {
      let routeJson = {};
      let result = collect(content, routeJson);
      result = lazy(result, routeJson).replace(/^[(\r\n)(\n)]*/g, '');
      this.checkRouteConfigResult(result);
    })
  }

  // 获取路径文件内容
  async function getFileContent(path) {
    try {
      const response = await fetch(path);
      if (response.ok) {
        const content = await response.text();
        return content;
      } else {
        throw new Error('文件读取失败')
      }
    } catch (error) {
      console.error(error);
    }
  }

  // 收集import对应的键值对
  function collect(source, stack) {
    return source.replace(/\bimport\s?([A-Z_]*)\s?from\s?(\B'.*'\B)/g, function (val, $1, $2) {
      Object.assign(stack, {
        [$1]: tag`${$2}`
      })
      return ''
    });
  }
  // 标签模板返回懒加载格式的路由写法
  function tag(staticStringArr, templateStr) {
    return `() => import(${templateStr})`;
  }
  // 将路由引入改为懒加载引入
  function lazy(source, stack) {
    return source.replace(/(?<='component':\s?)([A-Z_]+)/g, function (val, $1) {
      return stack[$1]
    })
  }

  function downloadResult(val) {
    // 要保存的字符串
    // dada 表示要转换的字符串数据，type 表示要转换的数据格式
    const blob = new Blob([val], {
      type: "text/plain;charset=utf-8"
    })
    // 根据 blob生成 url链接
    const objectURL = URL.createObjectURL(blob)

    // 创建一个 a 标签Tag
    const aTag = document.createElement('a')
    // 设置文件的下载地址
    aTag.href = objectURL
    // 设置保存后的文件名称
    aTag.download = "对应路由表对象.txt"
    // 给 a 标签添加点击事件
    aTag.click()
    // 释放一个之前已经存在的、通过调用 URL.createObjectURL() 创建的 URL 对象。
    // 当你结束使用某个 URL 对象之后，应该通过调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。
    URL.revokeObjectURL(objectURL)
  }

  function checkRouteConfigResult(source, stack) {
    const routeArr = source.match(/\[([\s\S]*)\]/g);
    // console.log(Array.from(routeArr));
    console.log(JSON.parse(routeArr));

  }

</script>

</html>